package com.eat.fish_service.netty_client.handler;


import com.eat.fish_service.netty_client.Message;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;


import io.netty.handler.codec.ByteToMessageCodec;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.operators.arithmetic.Concat;

import java.util.List;

/**
 * @author CZF
 * @create 2022-04-10 16:22
 */
@Slf4j
public class MessageCodec extends ByteToMessageCodec<Message> {

    //编码，把message写进byteBuf里，底层会自动write出去
    @Override                                                          //需要进行编码的对象  //将对象写入byteBuf
    protected void encode(ChannelHandlerContext channelHandlerContext, Message message, ByteBuf byteBuf) throws Exception {
        log.info("客户端编码器执行！");
        byteBuf.writeBytes(message.getHead());

        byteBuf.writeBytes(message.getLen());
        byteBuf.writeBytes(message.getUpdate());
        //控制器件开关数据
        byteBuf.writeBytes(message.getFengMingQi());
        byteBuf.writeBytes(message.getOutlet());
        byteBuf.writeBytes(message.getInlet());
        byteBuf.writeBytes(message.getLight());
        byteBuf.writeBytes(message.getOxygen());
        byteBuf.writeBytes(message.getFeed());
        byteBuf.writeBytes(message.getUv_lamp());
        byteBuf.writeBytes(message.getSpare1());

        //填充空位
        byteBuf.writeBytes(message.getValue1());
        byteBuf.writeBytes(message.getValue2());
        byteBuf.writeBytes(message.getValue3());
        byteBuf.writeBytes(message.getValue4());
        byteBuf.writeBytes(message.getValue5());
        byteBuf.writeBytes(message.getSpare2());
        byteBuf.writeBytes(message.getSpare3());

    }

    //解码
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        Message message = new Message();


        int head = byteBuf.readInt();
//        System.out.println(Integer.toBinaryString(head));
//        log.info("解码后的魔数为："+head);
        //101058054 为 byte[4]{6,6,6,6} 转化成的int
        if (head != 101058054){  //如果不符合协议的魔数，表示此次数据无效,回复给netty服务端说明数据无效

            System.out.println("不符合协议的魔数");
            //关闭通道
            channelHandlerContext.channel().close();
        }

        message = readMessage(message,byteBuf);

        //查看解码后的message
        log.info("解码后的message: "+message.toString());

        list.add(message);
    }

    //把byteBuf的数据读入message
    public Message readMessage(Message message,ByteBuf byteBuf){

//        log.info("读下标："+byteBuf.readerIndex());
        message.setHead(new byte[]{6,6,6,6});
        byteBuf.readBytes(message.getLen());
        byteBuf.readBytes(message.getUpdate());
        //控制器件开关数据
        byteBuf.readBytes(message.getFengMingQi());
        byteBuf.readBytes(message.getOutlet());
        byteBuf.readBytes(message.getInlet());
        byteBuf.readBytes(message.getLight());
        byteBuf.readBytes(message.getOxygen());
        byteBuf.readBytes(message.getFeed());
        byteBuf.readBytes(message.getUv_lamp());
        byteBuf.readBytes(message.getSpare1());

        byteBuf.readBytes(message.getValue1());
        byteBuf.readBytes(message.getValue2());
        byteBuf.readBytes(message.getValue3());
        byteBuf.readBytes(message.getValue4());
        byteBuf.readBytes(message.getValue5());
        byteBuf.readBytes(message.getSpare2());

        byteBuf.readBytes(message.getSpare3());

        return message;
    }
}
